home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / bin / compiz < prev    next >
Text File  |  2008-10-17  |  10KB  |  424 lines

  1. #!/bin/sh
  2. # Compiz Manager wrapper script
  3. # Copyright (c) 2007 Kristian Lyngst├╕l <kristian@bohemians.org>
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  19. #
  20. #
  21. # Contributions by: Trevi├▒o (3v1n0) <trevi55@gmail.com>, Ubuntu Packages
  22. #
  23. # Much of this code is based on Beryl code, also licensed under the GPL.
  24. # This script will detect what options we need to pass to compiz to get it
  25. # started, and start a default plugin and possibly window decorator.
  26.  
  27.  
  28. COMPIZ_BIN_PATH="/usr/local/bin/" # For window decorators and compiz
  29. PLUGIN_PATH="/usr/local/lib/compiz/" 
  30. GLXINFO="/usr/bin/glxinfo"
  31. KWIN="/usr/bin/kwin"
  32. METACITY="/usr/bin/metacity"
  33. COMPIZ_NAME="compiz" # Final name for compiz (compiz.real) 
  34.  
  35. # For Xgl LD_PRELOAD
  36. LIBGL_NVIDIA="/usr/lib/nvidia/libGL.so.1.2.xlibmesa"
  37. LIBGL_FGLRX="/usr/lib/fglrx/libGL.so.1.2.xlibmesa"
  38.  
  39. # Minimum amount of memory (in kilo bytes) that nVidia cards need
  40. # to be allowed to start
  41. # Set to 262144 to require 256MB
  42. NVIDIA_MEMORY="65536" # 64MB
  43. NVIDIA_SETTINGS="nvidia-settings" # Assume it's in the path by default
  44.  
  45. # For detecting what driver is in use, the + is for one or more /'s
  46. XORG_DRIVER_PATH="/usr/lib/xorg/modules/drivers/+"
  47.  
  48. if [ -x $METACITY ]; then
  49.     FALLBACKWM="${METACITY}"
  50. elif [ -x $KWIN ]; then
  51.     FALLBACKWM="${KWIN}"
  52. else
  53.     FALLBACKWM=true
  54. fi
  55. FALLBACKWM_OPTIONS="--replace $@"
  56.  
  57. # Driver whitelist
  58. WHITELIST="nvidia intel ati radeon i810 fglrx"
  59.  
  60. # blacklist based on the pci ids 
  61. # See http://wiki.compiz-fusion.org/Hardware/Blacklist for details
  62. #T="   1002:5954 1002:5854 1002:5955" # ati rs480
  63. #T="$T 1002:4153" # ATI Rv350
  64. #T="$T 1002:3152 1002:3150 1002:5462 1002:5653 " # ati X300 X600,X600 X700
  65. T="8086:1132"   # intel i815 (LP: #221920)
  66. T="$T 8086:2e02 " # Intel Eaglelake
  67. BLACKLIST_PCIIDS="$T"
  68. unset T
  69.  
  70. COMPIZ_OPTIONS="--ignore-desktop-hints --replace"
  71. COMPIZ_PLUGINS="core"
  72. ENV=""
  73.  
  74. # Use emerald by default if it exist
  75. USE_EMERALD="yes"
  76.  
  77. # No indirect by default
  78. INDIRECT="no"
  79.  
  80. # Default X.org log if xset q doesn't reveal it
  81. XORG_DEFAULT_LOG="/var/log/Xorg.0.log"
  82.  
  83. # Set to yes to enable verbose
  84. VERBOSE="yes"
  85.  
  86. # Echos the arguments if verbose
  87. verbose()
  88. {
  89.     if [ "x$VERBOSE" = "xyes" ]; then
  90.         printf "$*"
  91.     fi
  92. }
  93.  
  94. # abort script and run fallback windowmanager
  95. abort_with_fallback_wm()
  96. {
  97.     if [ "x$SKIP_CHECKS" = "xyes" ]; then
  98.         verbose "SKIP_CHECKS is yes, so continuing despite problems.\n"
  99.         return 0;
  100.     fi
  101.     
  102.     if [ "x$CM_DRY" = "xyes" ]; then
  103.         verbose "Dry run failed: Problems detected with 3D support.'n"
  104.         exit 1;
  105.     fi
  106.  
  107.     verbose "aborting and using fallback: $FALLBACKWM \n"
  108.  
  109.     if [ -x $FALLBACKWM ]; then
  110.         exec $FALLBACKWM $FALLBACKWM_OPTIONS
  111.     else
  112.         printf "no $FALLBACKWM found, exiting\n"
  113.         exit 1
  114.     fi
  115. }
  116.  
  117. # Check if we run with the Software Rasterizer, this happens e.g.
  118. # when a second screen session is opened via f-u-a on intel
  119. check_software_rasterizer()
  120. {
  121.     verbose "Checking for Software Rasterizer: "
  122.     if glxinfo 2> /dev/null | egrep -q '^OpenGL renderer string: Software Rasterizer' ; then
  123.         verbose "present. \n";
  124.         return 0;
  125.     else
  126.         verbose "Not present. \n"
  127.         return 1;
  128.     fi
  129.  
  130. }
  131.  
  132. # Check for non power of two texture support
  133. check_npot_texture()
  134. {
  135.     verbose "Checking for non power of two support: "
  136.     if glxinfo 2> /dev/null | egrep -q '(GL_ARB_texture_non_power_of_two|GL_NV_texture_rectangle|GL_EXT_texture_rectangle|GL_ARB_texture_rectangle)' ; then
  137.         verbose "present. \n";
  138.         return 0;
  139.     else
  140.         verbose "Not present. \n"
  141.         return 1;
  142.     fi
  143.  
  144. }
  145.  
  146. # Check for presence of FBConfig
  147. check_fbconfig()
  148. {
  149.     verbose "Checking for FBConfig: "
  150.     if [ "$INDIRECT" = "yes" ]; then
  151.         $GLXINFO -i | grep -q GLX.*fbconfig 
  152.         FB=$?
  153.     else
  154.         $GLXINFO | grep -q GLX.*fbconfig 
  155.         FB=$?
  156.     fi
  157.  
  158.     if [ $FB = "0" ]; then
  159.         unset FB
  160.         verbose "present. \n"
  161.         return 0;
  162.     else
  163.         unset FB
  164.         verbose "not present. \n"
  165.         return 1;
  166.     fi
  167. }
  168.  
  169.  
  170. # Check for TFP
  171. check_tfp()
  172. {
  173.     verbose "Checking for texture_from_pixmap: "
  174.     if [ $($GLXINFO 2>/dev/null | grep GLX_EXT_texture_from_pixmap -c) -gt 2 ] ; then
  175.         verbose "present. \n"
  176.         return 0;
  177.     else
  178.         verbose "not present. \n"
  179.         if [ "$INDIRECT" = "yes" ]; then
  180.             unset LIBGL_ALWAYS_INDIRECT
  181.             INDIRECT="no"
  182.             return 1;
  183.         else
  184.             verbose "Trying again with indirect rendering:\n";
  185.             INDIRECT="yes"
  186.             export LIBGL_ALWAYS_INDIRECT=1
  187.             check_tfp;
  188.             return $?
  189.         fi
  190.     fi
  191. }
  192.  
  193. # Check wether the composite extension is present
  194. check_composite()
  195. {
  196.     verbose "Checking for Composite extension: "
  197.     if xdpyinfo -queryExtensions | grep -q Composite ; then
  198.         verbose "present. \n";
  199.         return 0;
  200.     else
  201.         verbose "not present. \n";
  202.         return 1;
  203.     fi
  204. }
  205.  
  206. # Detects if Xgl is running
  207. check_xgl()
  208. {
  209.     verbose "Checking for Xgl: "
  210.     if xvinfo | grep -q Xgl ; then
  211.         verbose "present. \n"
  212.         return 0;
  213.     else
  214.         verbose "not present. \n"
  215.         return 1;
  216.     fi
  217. }
  218.  
  219. # Check if the nVidia card has enough video ram to make sense
  220. check_nvidia_memory()
  221. {
  222.     if [ ! -x "$NVIDIA_SETTINGS" ]; then
  223.     return 0
  224.     fi
  225.  
  226.     MEM=$(${NVIDIA_SETTINGS} -q VideoRam | egrep Attribute\ \'VideoRam\'\ .*: | cut -d: -f3 | sed 's/[^0-9]//g')
  227.     if [ $MEM -lt $NVIDIA_MEMORY ]; then
  228.         verbose "Less than ${NVIDIA_MEMORY}kb of memory and nVidia";
  229.         return 1;
  230.     fi
  231.     return 0;
  232. }
  233.  
  234. # Check for existence if NV-GLX
  235. check_nvidia()
  236. {
  237.     if [ ! -z $NVIDIA_INTERNAL_TEST ]; then
  238.         return $NVIDIA_INTERNAL_TEST;
  239.     fi
  240.     verbose "Checking for nVidia: "
  241.     if xdpyinfo | grep -q NV-GLX ; then
  242.         verbose "present. \n"
  243.         NVIDIA_INTERNAL_TEST=0
  244.         return 0;
  245.     else
  246.         verbose "not present. \n"
  247.         NVIDIA_INTERNAL_TEST=1
  248.         return 1;
  249.     fi
  250. }
  251.  
  252. # Check if the max texture size is large enough compared to the resolution
  253. check_texture_size()
  254. {
  255.     TEXTURE_LIMIT=$(glxinfo -l | grep GL_MAX_TEXTURE_SIZE | sed 's/.*=[^0-9]//g')
  256.     RESOLUTION=$(xdpyinfo  | grep -i dimensions: | sed 's/[^0-9]*pixels.*(.*).*//' | sed 's/[^0-9x]*//')
  257.     VRES=$(echo $RESOLUTION | sed 's/.*x//')
  258.     HRES=$(echo $RESOLUTION | sed 's/x.*//')
  259.     verbose "Comparing resolution ($RESOLUTION) to maximum 3D texture size ($TEXTURE_LIMIT): ";
  260.     if [ $VRES -gt $TEXTURE_LIMIT ] || [ $HRES -gt $TEXTURE_LIMIT ]; then
  261.         verbose "Failed.\n"
  262.         return 1;
  263.     fi
  264.     verbose "Passed.\n"
  265.     return 0
  266. }
  267.  
  268. # check driver whitelist
  269. running_under_whitelisted_driver()
  270. {
  271.     LOG=$(xset q|grep "Log file"|awk '{print $3}')
  272.     if [ "$LOG" = "" ]; then
  273.         verbose "xset q doesn't reveal the location of the log file. Using fallback $XORG_DEFAULT_LOG \n"
  274.         LOG=$XORG_DEFAULT_LOG;
  275.     fi
  276.     if [ -z "$LOG" ];then
  277.         verbose "AIEEEEH, no Log file found \n"
  278.         verbose "$(xset q) \n"
  279.     return 0
  280.     fi
  281.     for DRV in ${WHITELIST}; do
  282.         if egrep -q "Loading ${XORG_DRIVER_PATH}${DRV}_drv\.so" $LOG &&
  283.            ! egrep -q "Unloading ${XORG_DRIVER_PATH}${DRV}_drv\.so" $LOG; 
  284.         then
  285.             return 0
  286.         fi
  287.     done
  288.     verbose "No whitelisted driver found\n"
  289.     return 1
  290. }
  291.  
  292. # check pciid blacklist
  293. have_blacklisted_pciid()
  294. {
  295.     OUTPUT=$(lspci -n)
  296.     for ID in ${BLACKLIST_PCIIDS}; do
  297.         if echo "$OUTPUT" | egrep -q "$ID"; then
  298.             verbose "Blacklisted PCIID '$ID' found \n"
  299.             return 0
  300.         fi
  301.     done
  302.     OUTPUT=$(lspci -vn | grep -i VGA)
  303.     verbose "Detected PCI ID for VGA: $OUTPUT\n"
  304.     return 1
  305. }
  306.  
  307. build_env()
  308. {
  309.     if check_nvidia; then
  310.         ENV="__GL_YIELD=NOTHING "
  311.     fi
  312.     if [ "$INDIRECT" = "yes" ]; then
  313.         ENV="$ENV LIBGL_ALWAYS_INDIRECT=1 "
  314.     fi
  315.     if check_xgl; then
  316.         if [ -f ${LIBGL_NVIDIA} ]; then
  317.             ENV="$ENV LD_PRELOAD=${LIBGL_NVIDIA}"
  318.             verbose "Enabling Xgl with nVidia drivers...\n"
  319.         fi
  320.         if [ -f ${LIBGL_FGLRX} ]; then
  321.             ENV="$ENV LD_PRELOAD=${LIBGL_FGLRX}"
  322.             verbose "Enabling Xgl with fglrx ATi drivers...\n"
  323.         fi
  324.     fi
  325.  
  326.     ENV="$ENV FROM_WRAPPER=yes"
  327.  
  328.     if [ -n "$ENV" ]; then
  329.         export $ENV
  330.     fi
  331. }
  332.  
  333. build_args()
  334. {
  335.     if [ "x$INDIRECT" = "xyes" ]; then
  336.         COMPIZ_OPTIONS="$COMPIZ_OPTIONS --indirect-rendering "
  337.     fi
  338.     if check_nvidia; then
  339.         if [ "x$INDIRECT" != "xyes" ]; then
  340.             COMPIZ_OPTIONS="$COMPIZ_OPTIONS --loose-binding"
  341.         fi
  342.     fi
  343. }
  344.  
  345. ####################
  346. # Execution begins here.
  347.  
  348. # Read configuration from XDG paths
  349. if [ -z "$XDG_CONFIG_DIRS" ]; then
  350.     test -f /etc/xdg/compiz/compiz-manager && . /etc/xdg/compiz/compiz-manager
  351. else
  352.     OLD_IFS=$IFS
  353.     IFS=:
  354.     for CONFIG_DIR in $XDG_CONFIG_DIRS
  355.     do
  356.         test -f $CONFIG_DIR/compiz/compiz-manager && . $CONFIG_DIR/compiz/compiz-manager
  357.     done
  358.     IFS=$OLD_IFS
  359.     unset OLD_IFS
  360. fi
  361.  
  362. if [ -z "$XDG_CONFIG_HOME" ]; then
  363.     test -f $HOME/.config/compiz/compiz-manager && . $HOME/.config/compiz/compiz-manager
  364. else
  365.     test -f $XDG_CONFIG_HOME/compiz/compiz-manager && .  $XDG_CONFIG_HOME/compiz/compiz-manager
  366. fi
  367.  
  368. # Don't use compiz when running the failsafe session
  369. if [ "x$GNOME_DESKTOP_SESSION_ID" = "xFailsafe" ]; then
  370.     abort_with_fallback_wm
  371. fi
  372.  
  373. if [ "x$LIBGL_ALWAYS_INDIRECT" = "x1" ]; then
  374.     INDIRECT="yes";
  375. fi
  376.  
  377. # if we run under Xgl, we can skip some tests here
  378. if ! check_xgl; then
  379.     # if vesa or vga are in use, do not even try glxinfo (LP#119341)
  380.     if ! running_under_whitelisted_driver || have_blacklisted_pciid; then
  381.         abort_with_fallback_wm
  382.     fi
  383.     # check if we have the required bits to run compiz and if not, 
  384.     # fallback
  385.     if ! check_tfp || ! check_npot_texture || ! check_composite || ! check_texture_size; then
  386.         abort_with_fallback_wm
  387.     fi
  388.  
  389.     # check if we run with software rasterizer and if so, bail out
  390.     if check_software_rasterizer; then
  391.         verbose "Software rasterizer detected, aborting"
  392.         abort_with_fallback_wm
  393.     fi
  394.  
  395.     if check_nvidia && ! check_nvidia_memory; then
  396.         abort_with_fallback_wm
  397.     fi
  398.  
  399.     if ! check_fbconfig; then
  400.         abort_with_fallback_wm
  401.     fi
  402. fi
  403.  
  404. # load the ccp plugin if present and fallback to plain gconf if not
  405. if [ -f ${PLUGIN_PATH}libccp.so ]; then
  406.     COMPIZ_PLUGINS="$COMPIZ_PLUGINS ccp"
  407. elif [ -f ${PLUGIN_PATH}libgconf.so ]; then
  408.     COMPIZ_PLUGINS="$COMPIZ_PLUGINS glib gconf"
  409. fi
  410.  
  411. # get environment
  412. build_env
  413. build_args
  414.  
  415. if [ "x$CM_DRY" = "xyes" ]; then
  416.     verbose "Dry run finished: everything should work with regards to Compiz and 3D.\n"
  417.     exit 0;
  418. fi
  419.  
  420. ${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS || exec $FALLBACKWM $FALLBACKWM_OPTIONS
  421.  
  422.